package com.explorati.design_pattern.behavior.templatemethod.example;

/**
 * 抽象模板角色：该角色定义一个或多个操作，以便让子类实现；这些抽象操作是基本操作，是一个顶级逻辑的组成步骤
 * 还需要定义并实现一个或几个模板方法，这些模板方法一般是具体方法，即一个框架，实现对基本方法的调度，完成固定的逻辑
 * 
 * @author explorati
 *
 */
// 抽象模板，抽象账户类
public abstract class Account {

	// 账号
	private String accountNumber;

	public Account() {
		accountNumber = null;
	}

	public Account(String accountNumber) {
		this.accountNumber = accountNumber;
	}

	// 基本方法，确定账户类型，留给子类实现
	protected abstract String getAccountType();

	// 基本方法，确定利息，留给子类实现
	protected abstract double getInterestRate();

	// 基本方法，根据账户类型和账号确定账户金额
	public double calculateAmount(String accountType, String accountNumber) {
		// 访问数据库....(此处仅示意性的返回一个数值)
		return 4567.00D;
	}

	// 模板方法，计算账户利息
	public double calculateInterest() {
		String accountType = getAccountType();
		double interestRate = getInterestRate();
		double amount = calculateAmount(accountType, accountNumber);
		return amount * interestRate;
	}
}
